package admin

import (
	"MBGAdmin/models"
	"MBGAdmin/util"
	"github.com/astaxie/beego/orm"
	"strconv"
)

// 角色控制器
type RoleController struct {
	AuthController
}

// 角色首页
func (c *RoleController) Get() {
	c.Display("admin/role/index.html")
}

// 角色列表获取
func (c *RoleController) GetLists() {
	page, _ := strconv.Atoi(c.GetString("page"))
	limit, _ := strconv.Atoi(c.GetString("limit"))
	o := orm.NewOrm()
	p := o.QueryTable(models.Roles{})
	// 条件筛选
	if name := c.GetString("name"); name != "" {
		p = p.Filter("name__contains", name)
	}
	// 根据page和limit取数据
	var roles []*models.Roles
	_, err := p.Offset((page - 1) * limit).Limit(limit).RelatedSel().OrderBy("id").All(&roles)
	count, _ := p.Count()
	if err != nil {
		c.BaseResponse(1, "获取列表失败:"+err.Error())
		return
	}
	// 封装结果
	rsp := make(map[string]interface{})
	rsp["count"] = count
	rsp["lists"] = roles
	c.BaseResponse(0, "获取列表成功", rsp)
}

// 删除角色
func (c *RoleController) Delete() {
	id, _ := c.GetInt(":id")
	if id == 1 {
		c.BaseResponse(1, "系统角色不可删除")
		return
	}
	role := models.Roles{Id: id}
	err := role.DeleteRolesById()
	if err != nil {
		c.BaseResponse(1, "删除角色失败："+err.Error())
		return
	}
	c.BaseResponse(0, "删除角色成功")
}

// 添加角色页面
func (c *RoleController) CreateView() {
	// 获取全部菜单
	var lists []orm.ParamsList
	_, _ = orm.NewOrm().QueryTable(models.Menus{}).ValuesList(&lists, "id")
	c.Data["menus"] = util.GetMenuStructByTopId(lists, 0, 3)
	c.Display("admin/role/create.html")
}

// 添加角色
func (c *RoleController) Create() {
	// 解析表单参数
	role := models.Roles{}
	if err := c.ParseForm(&role); err != nil {
		c.BaseResponse(1, "解析表单出错："+err.Error())
		return
	}
	// 插入数据库
	if err := role.AddRoles(); err != nil {
		c.BaseResponse(1, "创建角色失败："+err.Error())
		return
	}
	// 更新权限
	util.SetRoleMenuByRoleIdAndMenuIds(role.Id, c.GetString("menus"))
	c.BaseResponse(0, "创建角色成功")
}

// 编辑角色页面
func (c *RoleController) UpdateView() {
	// 解析ID
	id, err := c.GetInt(":id")
	if err != nil {
		c.BaseResponse(1, "解析ID错误,请刷新页面后重试")
		return
	}
	// 根据ID获取role
	role := models.Roles{Id: id}
	err = role.GetRolesById()
	if err != nil {
		c.BaseResponse(1, "ID不存在,请刷新页面后重试")
		return
	}
	// 获取全部菜单
	var lists []orm.ParamsList
	_, _ = orm.NewOrm().QueryTable(models.Menus{}).ValuesList(&lists, "id")
	c.Data["menus"] = util.GetMenuStructByTopId(lists, 0, 3)
	c.Data["role"] = role
	c.Display("admin/role/update.html")
}

// 编辑角色
func (c *RoleController) Update() {
	// 解析表单参数
	roleNew := models.Roles{}
	if err := c.ParseForm(&roleNew); err != nil {
		c.BaseResponse(1, "解析表单出错："+err.Error())
		return
	}
	// 解析ID
	id, err := c.GetInt(":id")
	if err != nil {
		c.BaseResponse(1, "ID解析失败")
		return
	}
	// 根据ID查找数据库是否存在
	roleOld := models.Roles{Id: id}
	err = roleOld.GetRolesById()
	if err != nil {
		c.BaseResponse(1, "ID不存在")
		return
	}
	// 封装修改参数
	roleOld.Name = roleNew.Name
	roleOld.Describe = roleNew.Describe
	roleOld.Status = roleNew.Status
	// 根据ID修改数据
	err = roleOld.UpdateRolesById()
	if err != nil {
		c.BaseResponse(1, "修改失败"+err.Error())
		return
	}
	// 更新权限
	util.SetRoleMenuByRoleIdAndMenuIds(roleOld.Id, c.GetString("menus"))
	c.BaseResponse(0, "修改成功")
}
